//
// Created by lmy on 2024/11/18.
//

#include "referced.h"
#include <iostream>

using namespace std;

void func1(int no, string str)    // 传值。
{
    no = 8;
    str = "我有一只小小鸟。";
    cout << "亲爱的" << no << "号：" << str << endl;
}

void func2(int *const no, string *str)    // 传地址。
{
    *no = 8;
    *str = "我有一只小小鸟。";
    cout << "亲爱的" << *no << "号：" << *str << endl;
}

void func3(int &no, const string &str)    // 传引用。
{
    no = 8;
//    str = "我有一只小小鸟。";
    cout << "亲爱的" << no << "号：" << str << endl;
}

void func4(int &no, string &&str)    // 右值引用 。
{
    no = 8;
    str = "我有一只小小鸟。";
    cout << "亲爱的" << no << "号：" << str << endl;
}

void func5(int &no, string const &&str)    // 右值引用 。
{
    no = 8;
    cout << "亲爱的" << no << "号：" << str << endl;
}

class czs {
public:
    int age;

    czs() {
        cout << "czs" << endl;
    }

    void operator()(const int &no) {
        cout << "亲爱的" << no << age << "号：我是一只傻傻鸟。\n";
    }
};

class AA {
public:
    AA() {
        cout << " 创建AA：" << endl;
    }

    ~AA() {
        cout << " 销毁AA：" << endl;
    }

    int m_a;
};

int getInt();

AA getTemp() {
//    AA v = AA();
    return AA();
}

int getInt() {
    int &&a = 3;         // 3是右值。

    int b = 8;               // b是左值。
    int &&c = b + 5;   //  b+5是右值。
//    int &d=2; 报错
    const int &d = 2;
    AA &&aa = getTemp();   // getTemp()的返回值是右值（临时变量）。
//    AA &a2 = getTemp();报错

    cout << "a=" << a << endl;
    cout << "c=" << c << endl;
    cout << "aa.m_a=" << aa.m_a << endl;
    return a;
}

int main() {
    getInt();
    return 1;
    // 声明 / 创建引用的语法：数据类型 & 引用名 = 原变量名;
    int a = 3;          // 声明普通的整型变量。
    int &ra = a;      // 创建引用ra，ra是a的别名。
    int *const cp = &a;
    *cp = 1;
    cout << " a的地址是：" << &a << "， a的值是：" << a << endl;
    cout << "ra的地址是：" << &ra << "，ra的值是：" << ra << endl;

    cout << "cp的内容是：" << cp << "，ra的地址：" << &cp << endl;

    ra = 5;

    cout << " a的地址是：" << &a << "， a的值是：" << a << endl;
    cout << "ra的地址是：" << &ra << "，ra的值是：" << ra << endl;


    func1(1, "ddd");
    int i = 9;
    string s = "xx";
    func1(i, s);
    int *x = &i;
    func2(x, &s);
    int *const p = &i;
    func3(i, s);
    func3(ra, s);
    func3(i, "xx");//加const不报错
    func3(*p, s);
    func4(i, "xx");
    func5(i, "dd");

    s = "";
    const int xz = s.size();
    auto xx = czs();
    cout << xx.age << endl;
}


